#include <stdio.h>
#include <stdbool.h>

#define Size 10

//初始化函数
void InitBoard(char (*Board)[Size])
{
    for(int i = 0; i < Size; i++)
    {
        for(int j = 0; j < Size; j++)
        {
            Board[i][j] = '-';
        }
    }
}

//打印棋盘
void PrintBoard(char (*Board)[Size])
{
    printf("     ");
    for(int i = 0; i < Size; i++)
    {
        printf("%4d ", i + 1);
    }
    printf("\n");
    for(int i = 0; i < Size; i++)
    {
        printf("%4d ", i + 1);
        for(int j = 0; j < Size; j++)
        {
            printf("%4c ", Board[i][j]);
        }
        printf("\n"); 
    }
}

//下棋
//二元返回值，用bool类型，返回值为true或false
bool MakeMove(char (*Board)[Size], int row, int column, char player) //棋盘、位置：行列、人
{
    //非法位置
    if(row < 0 || row >= Size || column < 0 || column >= Size)
    {
        printf("非法的下棋位置，请重新输入\n");
        return false;
    }

    //已有棋子
    if(Board[row][column] != '-')
    {
        printf("该位置已经有棋子了，请重新输入\n");
        return false;
    }
    Board[row][column] = player;
    return true;
}

//判断位置是否合法
bool IsValidPlace(int row, int column)
{
    if(row < 0 || row >= Size || column < 0 || column >= Size)
    return false;
    return true;
}
//判胜
bool CheckIsWin(char (*Board)[Size], int row, int column, char player)
{
    int direction[4][2] = 
    {
        {1, 0}, {1, 1}, {0, 1}, {-1, 1}
    };
    //遍历4个方向，数棋子数量
    for(int i = 0; i < 4; i++)
    {
        int count = 1;
        //下一颗棋子的位置
        int dx = row + direction[i][0];
        int dy = column + direction[i][1];
        while(IsValidPlace(dx, dy) && Board[dx][dy] == player)
        {
            count++;
            if(count >= 5)
            return true;
            dx = dx + direction[i][0];
            dy = dy + direction[i][1];
        }
        //反方向继续找
        dx = row - direction[i][0];
        dy = column - direction[i][1];
        while(IsValidPlace(dx, dy) && Board[dx][dy] == player)
        {
            count++;
            if(count >= 5)
            return true;
        dx = dx - direction[i][0];
        dy = dy - direction[i][1];
        }
    }
    return false;
}


//判平
bool CheckIsDraw(char (*Board)[Size])
{
    for(int i = 0; i < Size; i++)
    {
        for(int j = 0; j < Size; j++)
        {
            if(Board[i][j] == '-')
            return false;
        }
    }
    return true;
}

int main()
{
    char Board[Size][Size] = {0};
   InitBoard(Board);

    char player = 'x';
    while(1)
    {
        PrintBoard(Board);
        int row = 0, column = 0;
        printf("请|%c|选手下棋:", player);
        //阻塞性函数:让程序进入等待状态，直到条件满足继续执行
        scanf("%d %d", &row, &column);
        if(MakeMove(Board, row - 1, column - 1, player) == false)
        {
            continue;
        }
        if(CheckIsWin(Board, row - 1, column - 1, player) == true)
        {
            PrintBoard(Board);
            printf("恭喜|%c|选手获胜", player);
            break;
        }
        if(CheckIsDraw(Board) == true)
        {
            PrintBoard(Board);
            printf("平局！\n");
            break;
        }
        player  = (player == 'x' ? '0' : 'x');
    }
    return 0;
}